#include "funcProcAtomIng.h"

void FuncProcAtomIng::liberar_datos(){
	std::vector<TipoDato *>::iterator it = datos.begin();
	
	while(it != datos.end() ){
		delete (*it);
		++it;
	}
	this->datos.clear();
}

FuncProcAtomIng::~FuncProcAtomIng(){
	liberar_datos();
}

unsigned int FuncProcAtomIng::operator() (const std::string &expr, TipoStruct* reg_modelo, unsigned int pos){
	//Obtengo los datos atomicos, validando los datos leidos
	liberar_datos();
	this->datos = Parser::obtener_datos_atomicos(expr);
	
	//Tomo todos los datos recien obtenidos y los intento meter en el reg modelo
	
	std::vector<TipoDato*>::iterator it = datos.begin();
	//Si hay mas datos que campos faltantes en el reg_modelo arrojo una excepcion de error de sintaxis
	if ( datos.size() > (reg_modelo->get_tamanio() - pos) )
		throw ExcepSintaxisParser ("Error - Hay mas datos que los soportados por el formato del archivo.");
	//Recorro todo el vector de datos atomicos, y los intento meter en el tipo_struct, a partir de la pos
	//dada por param.
	unsigned int cont = pos;
	while (it != datos.end()){
			TipoDato* aux = (*it);
			try {
				(*reg_modelo)[cont] = *aux;
				it++;
			} catch (ExcepErrorTipos &e) {
				if ( (((*reg_modelo)[cont]).es_obligatorio()) && (((*reg_modelo)[cont]).esta_cargado()) )
					throw ExcepSintaxisParser ("Error - Sintaxis de datos incorrecta.");	
			} catch (ExcepIndiceDesbordado &e2) {
				throw ExcepSintaxisParser ("Error - Sintaxis de datos incorrecta.");
			}
			cont++;
	}
	
	return cont;
}
